package com.jt.interceptor;

import com.jt.pojo.User;
import com.jt.utils.CookieUtil;
import com.jt.utils.ObjectMapperUtil;
import com.jt.utils.ThreadLocalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import redis.clients.jedis.JedisCluster;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author dc
 * @Classname UserInterceptor
 * @Date 2020/2/29 11:42
 */
@Component
public class UserInterceptor implements HandlerInterceptor {

    @Autowired
    private JedisCluster redis;

    /**
     * SpringMvc封装的API
     * 旧配置：web.xml
     * 拦截器
     * 	 目的：为了控制页面请求的跳转
     * 	1.preHandle 处理器执行之前进行拦截
     * 	2.postHandle 处理器执行之后前进行拦截
     *  3.afterCompletion 全部逻辑完成并且视图渲染后拦截
     *  /**
     * 	 * 在spring4版本中要求必须重写3个方法,不管是否需要
     * 	 * 在spring5版本中在接口中添加default属性,则省略不写.
     *
     * 返回值结果:
     * 	true: 拦截放行.
     * 	false: 请求拦截. 重定向到登录页面
     *
     * 业务逻辑:
     * 	1.获取Cookie数据
     *  2.从cookie中获取token(TICKET)
     *  3.判断redis缓存服务器中是否有数据.
     */

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        //1.判断用户是否有cookie
        String ticket = CookieUtil.getCookieValue(request, "JT_TICKET");
        if(!StringUtils.isEmpty(ticket)){
            //2.表示ticket信息不为null
            String userJson = redis.get(ticket);
            if(!StringUtils.isEmpty(userJson)){
                //redis数据一切正常
                User user= ObjectMapperUtil.toObject(userJson, User.class);
                request.setAttribute("JT_USER",user);
                /**将数据存入线程中*/
                ThreadLocalUtil.setUser(user);
                //请求放行
                return true;
            }
            else {
                //用户有ticket，但是redis中没有数据，cookie有问题
                CookieUtil.deleteCookie(response,"JT_TICKET","jt.com","/");
            }
        }
        response.sendRedirect("/user/login.html");
        return false;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //删除Threadlocal中的数据,防止数据泄露
        ThreadLocalUtil.remove();
    }
}
